WITH Ada.Text_IO;
WITH Bulletin.Composants;
WITH Bulletin.Fonctionalites;
WITH Matiere.Composants;
WITH Valeur;
PROCEDURE Resumer (Un_Bulletin : Bulletin.Bulletin) IS

   Vide : Bulletin.T_Matieres (1 .. 0);


   PROCEDURE Parcours (A_Parcourir, Retenues : Bulletin.T_Matieres;
                       Poids_En_Attente, Poids_Total : Natural;
                       Points_Acquis : Natural)  IS
   BEGIN

      IF A_Parcourir'Length = 0 then

         IF Poids_en_attente = 0 OR Points_Acquis > Bulletin.composants.GetObjectif(Un_Bulletin) * Poids_Total then
            Ada.Text_IO.Put("Moyenne atteinte : ");
            Valeur.Put(Ada.Text_IO.Current_Output,(Points_Acquis / Poids_Total));


         elsIF Bulletin.composants.GetObjectif(Un_Bulletin) * Poids_Total > Points_Acquis + Poids_En_Attente * 2000 then
            Ada.Text_IO.Put(Ada.Text_IO.Current_Output,"Moyenne la plus proche de l'Objectif possible : ");
             Valeur.Put(Ada.Text_IO.Current_Output,((Points_Acquis + Poids_En_Attente * 2000) / Poids_Total ));

         else
            Ada.Text_IO.Put("Moyenne a obtenir sur les matieres dont la note est Libre : ");
            Valeur.Put(Ada.Text_IO.Current_Output,(Bulletin.composants.GetObjectif(Un_Bulletin) * Poids_Total - Points_Acquis) / Poids_En_Attente );
         END IF;

         Ada.Text_IO.New_Line;
         Ada.Text_IO.Put_Line("------------------------------");


      else
         CASE Matiere.Composants.Etat2Natural(A_Parcourir(A_Parcourir'First)) IS

         WHEN 0=>
            Parcours
              (A_Parcourir => A_Parcourir (A_Parcourir'First + 1 .. A_Parcourir'Last),
               Retenues => Bulletin.Fonctionalites.EnregIStrerTabMat (tabMat => Retenues, maMatiere => A_Parcourir (A_Parcourir'First)),
               Poids_En_Attente => Poids_En_Attente + Matiere.Composants.GetCoefficient( A_Parcourir (A_Parcourir'First) ),
               Poids_Total=> Poids_Total + Matiere.Composants.GetCoefficient( A_Parcourir (A_Parcourir'First) ),
               Points_Acquis => Points_Acquis);

         WHEN 2=>
            Parcours
              (A_Parcourir => A_Parcourir (A_Parcourir'First + 1 .. A_Parcourir'Last),
               Retenues => Retenues,
               Poids_En_Attente => Poids_En_Attente,
               Poids_Total => Poids_Total + Matiere.Composants.GetCoefficient( A_Parcourir (A_Parcourir'First) ),
               Points_Acquis =>
                 (Points_Acquis
                  + Matiere.Composants.GetValeurNote(A_Parcourir (A_Parcourir'First))
                  * Matiere.Composants.GetCoefficient( A_Parcourir (A_Parcourir'First) )));

         WHEN 1=>
            Parcours
              (A_Parcourir => A_Parcourir (A_Parcourir'First + 1 .. A_Parcourir'Last),
               Retenues => Retenues,
               Poids_En_Attente => Poids_En_Attente,
               Poids_Total=> Poids_Total + Matiere.Composants.GetCoefficient( A_Parcourir (A_Parcourir'First) ),
               Points_Acquis =>
                 (Points_Acquis
                  + (Matiere.Composants.GetValeurNote(A_Parcourir (A_Parcourir'First))
                    * Matiere.Composants.GetCoefficient( A_Parcourir (A_Parcourir'First) ))));

         END CASE;
      END IF;
   END Parcours;


BEGIN
   IF Bulletin.Composants.GetT_Matieres(Un_Bulletin)'Length > 0 then
      Parcours (A_Parcourir => Bulletin.Composants.GetT_Matieres(Un_Bulletin),
                Retenues => Vide,
                Poids_En_Attente => 0,
                Poids_Total => 0,
                Points_Acquis => 0);
   END IF;

END Resumer;
